linuxmasterfandomcom-20200214-history
Convert
If you're on some Linux system, imagemagick is perfect. I.e convert somefile.png somefile.svg This works with heaps of different formats. For other media such as videos and audio use (ffmpeg) I know you clearly stated png to svg, however; It's still media related. ffmpeg -i somefile.mp3 somefile.ogg Just a tip for if you wish to go through lots of files; a loop using basic shell tricks.. for f in *.jpg; do convert $f ${f%jpg}png; done That removes the jpg and adds png which tells convert what you want. too more imagemagick convert Очень часто у многих появляется задача массового изменения фотографий или других изображений. К примеру вы только что сделали пару сотен фотографий и хотите скинуть их на файлообменный сервис, но они занимают слишком много места. Можно уменьшить их разрешение что‐бы они стали меньше, но уменьшать каждую картинку по одному очень долго. Тут на помощь придут возможности shell и утилита convert из пакета ImageMagick (или GraphicsMagick). $ convert -resize 640x480 Image.jpg mini_image.jpg Для массового изменения изображений можно воспользоваться возможностями командной оболочки. К примеру цикл for в bash. $ for name in `ls *.jpg` do ; convert -resize 640x480 $name mini/$name (or for name in `ls *.jpg`; do convert -resize 640x480 $name mini/$name; done) Или в tcsh с помощью foreach. % foreach name ( `ls *.jpg` ) convert -resize 640x480 $name mini/$name end Или можно с помощью xargs. $ ls *.jpg | xargs -I'{}' convert -resize 640x480 {} newmini/{} Или разделённые нулевым символом. $ find ./ -maxdepth 1 -iname '*.jpg' -printf '%f\0' | xargs --null -I'{}' convert -resize 640x480 {} newmini/{} Есть ещё десяток способов а то и больше как работать с множеством файлов, но эта статья не об этом. По этому дальше примеры будут показываться на одном файле за исключением некоторых случаев. В качестве аргументов параметру -resize можно давать также проценты. $ convert -resize 50% Image.jpg mini_image.jpg Также можно добавить параметр -quality который задаёт уровень сжатия. $ convert -resize 640x480 -quality 30 Image.jpg mini_image2.jpg $ du -ch mini_image* 24K mini_image2.jpg 80K mini_image.jpg 104K итого Также часто возникает задача перевернуть изображение. Это можно сделать с помощью -rotate, которой параметры задаются в градусах. $ convert -rotate 90 Image.jpg rotate_image.jpg Градус может быть любым, но если он не делиться на 90 нацело, то пустые места будут заполнены белым цветом. При желании цвет можно поменять с помощью опции -background. К примеру, возьмём вот такое изображение: Перевернём его на 120 градусов. $ convert -rotate 120 ex_or.jpg ex1.jpg В результате получим такое: Как видим оно дополнилось белым цветом, а разрешение стало больше (тут не заметно так как для норм вёрстки изображения обрезаны по одному размеру, для просмотра оригинального изображения нажмите на него). Теперь приведём пример с использованием опции -background. $ convert -rotate 120 -background blue ex_or.jpg ex2.jpg Получим такое: Цвет можно задать несколькими способами. К примеру красный: -background red -background "#FF0000" -background "rgb(255,0,0)" Короткое имя цвета можно посмотреть с помощью такой команды: $ convert -list color Утилита convert может делать несколько действий сразу. К примеру можно изменить размер изображения и перевернуть его одновременно. Очередность указания опций также имеет значение. Первым исполняются те действия которые были указанны первыми. Так команда: $ convert -resize 640x480 -rotate 120 image.jpg new_image.jpg и команда $ convert -rotate 120 -resize 640x480 image.jpg new_image2.jpg приведут к разным результатам. В первой команде мы сначала изменяем размер и потом переворачиваем изображение, во второй сначала переворачиваем, а потом меняем размер того что получили. Часто приходится обрезать края изображения. Утилитой convert это можно сделать с помощью опции -chop, -shave. Опция -shave удаляет одинаковые поля с обеих сторон. $ convert -shave 200x image.jpg image2.jpg Этот пример удалит 200 пикселей с левой и правой стороны. $ convert -shave 200x300 image.jpg image2.jpg А эта команда удалит 200 писелей с права и лева, и 300 пикселей с верху и снизу. Обе эти опции опции, а также -resize, принимают в качестве аргумента geometry. Этот аргумент может быть задан разными способами, выше демонстрировалось только два — в процентах и параметры ширины и высоты. * scale% — Высота и ширина заданная в процентах. * scale-x%xscale-y% — Процент заданный для высоты и ширины отдельно. (Достаточно одно символа % .) * width — Задана только ширина, высоты выставляется автоматически с таким‐же соотношении как было. * xheight — Задана высота, ширина автоматически выставляется по соотношению сторон. * widthxheight — Максимальное значение ширины и высоты, соотношение сторон остаётся таким‐же. * widthxheight^ — Минимальное значение ширины и высоты, соотношение сторон остаётся таким‐же. * widthxheight! — Задаётся значение ширины и высоты, соотношение сторон игнорируется. * widthxheight> — Работает также как widthxheight но только если изображение больше указанного размера. * widthxheight< — Изменить разрешение только если оба размера изображения превышают то которое заданно. * area@ — Изменить размер изображения что-бы оно имело такое количество пикселей. Опция -shop удаляет слева и сверху. $ convert -chop 200x100 image.jpg image2.jpg Указанная команда удалит 200 пикселей с лева и 100 сверху. Место откуда вырезаются пиксели можно поменять с помощью опции -gravity. Просмотреть все варианты можно с помощью команды: $ convert -list gravity По умолчанию она установлена в NorthWest. Для того что‐бы операция chop удаляла пиксели с права и сверху опцию -gravity необходимо поставить в SouthEast. Например: $ convert -gravity SouthEast -chop 200x200 image.jpg image3.jpg Если надо обрезать поля со всех сторон, можно применить операцию chop дважды с разным gravity. $ convert -gravity NorthWest -chop 100x150 -gravity SouthEast -chop 200x200 image.jpg image4.jpg Эта команда удалит 100 пикселей с лева, 150 сверху, 200 с права и 200 снизу. Есть другой вариант обрезать края со всех сторон, но он не такой эффективный. $ convert -chop 100x150 -rotate 180 -chop 200x200 -rotate 180 image.jpg image5.jpg Результат получается такой‐же но утилита convert делает лишние действия по обращению изображения. Также можно удалять пиксели из центра но как правило это не имеет смысла. Опция -splice наоборот, добавляет новые пиксели цвета который указан с помощью -background, а если он не указан используется белый. Новые пиксели по умолчанию добавляются слева и сверху, но это можно изменить с помощью опции -gravity аналогично как и с chop. элкниги Есть отсканированные документы и из них надо собрать djvu или pdf книгу. Для того чтобы их превратить в pdf документ можно воспользоваться ImageMagick(или GraphicsMagick). Простой пример создания pdf документа: $ convert *.jpg book.pdf В GrapicsMagick эта команда может выглядеть так: $ gm convert *.jpg book.pdf Вместо *.jpg можно использовать другой формат или список файлов. Список файлов удобнее использовать для того, чтобы задать порядок следования страниц в файле. Например: $ convert file1.jpg file2.png file3.gif book.pdf или $ convert $( ls | egrep '(png|gif|pnm|pbm|pgm|jpg|jpeg)$' | sort -n) book.pdf В этом примере sort -n используется для изменения порядка следования страниц. Файл который получается может оказаться слишком большим. Чтобы уменьшить его можно воспользоваться алгоритмами сжатия которые поддерживают pdf документы. Список алгоритмов сжатия приведён ниже в таблице: Zip — это алгоритм сжатия без потерь. Есть смысл его использовать только если исходное изображение в формате tiff,pbm,pnm,pgm или аналогичном. Наибольшего результата сжатия можно добиться используя алгоритм сжатия с потерями jpeg. При сжатии с потерями для указания качества в процентах используется опция -quality. Например: $ convert -compress jpeg -quality 60 *.jpg book.pdf Также можно использовать опцию -monochrome для создания чёрно-белых документов, что уменьшит размер выходного файла. Алгоритм сжатия fax можно использовать только с чёрно-белыми изображениями. Также чтобы уменьшить размер файла можно изменить разрешение c помощью опции -resize. Теперь попробуем создать djvu файл. Для этого сначала надо преобразовать изображения в формат ppm,pgm или pbm. Pnm — используется для цветных изображений, pgm — чёрно-белые с градациями серого, а pbm чёрно-белый без градаций серого (есть только чёрный и белый). Формат pnm может представлять файлы в форматах ppm,pgm и pbm. Естественно, если использовать изображения в формате pbm то выходной djvu файл будет меньше. Сначала конвертируем все изображения в формат pnm. Для этого можно воспользоваться ImageMagick или утилитой anytopnm. Конвертировать одно изображение можно так: $ convert image.jpg image.ppm или $ anytopnm image.jpg > image.ppm Все файлы можно конвертировать таким образом: $ for name in $(ls | egrep 'png|jpg|gif') ; do convert $name $(echo $name | sed -r 's/(.*)\.^\.+/\1/').ppm ; done После того, как изображения конвертированы в ppm те, которые не содержат цветов можно конвертировать в pgm c помощью ppmtopgm. $ ppmtopgm file1.ppm > file1.pgm Это тоже можно сделать в цикле. Теперь pgm изображения можно преобразовать в pbm с помощью pgmtopbm. Например: $ pgmtopbm -threshold -value 0.6 file1.pgm > file1.pbm Опция -threshold задаёт алгоритм преобразования, а -value число переход от белого к чёрному. Чем выше -value тем чернее будет изображение. После этого все файлы ppm, pgm, pbm переименовываем в pnm, так как там будет проще сними работать. Далее превращаем каждое изображение в формат djvu. Для этого используем с44. $ c44 -slice 82 file.pnm file.djvu Или всё сразу: $ for name in $(ls | grep 'pnm') ; do c44 $name -slice 82 $(echo $name | sed -r 's/(.*)\.^\.+/\1/').djvu ; done Опция -slice влияет на выходной размер файла, детальнее опции утилиты с44 смотрите на сайте разработчика. Теперь осталось только объединить все djvu файлы в один. $ djvm book.djvu page1.djvu page2.djvu page3.djvu pageN.djvu Всё теперь требуемая книга в формате djvu готова.